前面提到過可以先創建DockerFile,在用只另去生成image然後再用一些指令可以創建容器並做一些設定。
但這裡其實有另一種方式,就是透過docker compose及sail去創建容器。
什麼事docker compose?
Docker Compose 是 Docker 的一個工具,專門用於定義和運行多容器 Docker 應用程序。它允許使用者使用docker-compose.yml檔案來定義多個容器的設置和相互之間的連接,而不是逐一運行多個容器。
什麼事sail
Sail 是 Laravel 框架為 Docker 提供的輕量級指令列界面。其主要目的是為 Laravel 開發者提供一個簡單的方式來在 Docker 環境中運行 Laravel 應用程序。
這裡我是直接透過sail指令去創建docker.compose.yml
php artisan sail
定義要創建的容器的一些設定…。 這樣做一次可以創建多個容器, 而且假設你要用別人的image就直接執行這個,不一定要生成dockerFile
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.2
dockerfile: Dockerfile
args:
WWWGROUP: 20
WWWUSER: 501
image: sail-8.2/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
# WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
IGNITION_LOCAL_SITES_PATH: '${PWD}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3307}:3306'
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_ROOT_HOST: '%'
MYSQL_DATABASE: 'pokemon'
MYSQL_USER: 'wade'
MYSQL_PASSWORD: your_password
# MYSQL_ALLOW_EMPTY_PASSWORD: 1
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
volumes:
- 'sail-mysql:/var/lib/mysql'
- './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test:
- CMD
- mysqladmin
- ping
- '-p${DB_PASSWORD}'
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sail-mysql:
driver: local
根據上面的設定,我想研究一下各自的一些功能是什麼:
這裡定義了兩個服務(容器)這裡是你可以自己去定義名稱):laravel.test 和 mysql. 。
這個服務可能是您的 Laravel 應用程序,它具有以下設定:
build
:
描述如何構建 Docker 映像。它使用 Dockerfile
文件和上下文路徑來構建映像。
context: ./vendor/laravel/sail/runtimes/8.2
dockerfile: Dockerfile
這兩句話的意思是,我要在context設定的路徑中去尋找叫做Dockerfile的dockerfile
這裡的 WWWUSER
和 WWWGROUP
是在設定當你建立這個容器時,應該要使用哪個用戶和組 ID 來運行容器內的進程。
image
:
指定要用於容器的 Docker 映像。
build選項和image選項的一些使用細節:
extra_hosts
:
這個選項允許您添加額外的主機名。
簡單來說這裡設定我可以用host.docker.internal 來訪問主機
ports
:
映射容器的端口到主機。例如,主機的 80 端口映射到容器的 80 端口。
environment
:
定義了容器內的環境變量。
volumes
:
前面有提到過,根據你使用的路徑,他會決定你是要用bind mount還是volume:
我這裡是用bind mount:
所以他會映射主機文件系統上的目錄或文件到容器中。
映射(Mapping):
通常指的是將主機的一個目錄或文件與容器內的一個目錄或文件相關聯,使得容器可以讀取和寫入主機上的特定目錄或文件。
networks
:
sail
的網路。depends_on
: 定義服務的依賴性,在這裡,laravel.test
依賴於 mysql
服務,這裡指的指示啟動順序而已,所以我這樣設定mysql會先開啟。
創建容器
docker-compose up --build //or docker-compose up -d
d
標誌表示在後台運行,這樣你就可以在容器啟動後繼續使用終端機。列出運行中的容器
docker ps
或使用 Docker Compose:
docker-compose ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2624983f461 sail-8.2/app "start-container" 36 seconds ago Up 33 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:5173->5173/tcp, 8000/tcp pokemon-laravel.test-1
4bc1c45d8709 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 36 seconds ago Up 33 seconds (healthy) 33060-33061/tcp, 0.0.0.0:3307->3306/tcp pokemon-mysql-1
這裡主要還會顯示本地主機是用哪一個port號和容器做連結,左邊的部分是主機的port號,右邊的部分是容器的port號。
停止和移除容器
如果你需要停止和移除容器,可以使用以下命令:
docker stop <容器名稱或ID> docker rm <容器名稱或ID>
or
docker-compose down
進入容器的終端機
有時候你可能要在容器上進行一些操作,比如你使用laravel的容器,你可能要進行一些php artisan migrate… 或是composer install等等的指令,就可以進入容器的終端。
如果你知道容器的名稱或ID,你可以使用以下命令進入容器的終端機:
docker exec -it <容器名稱或ID> /bin/bash
或者,如果容器是使用 Docker Compose 啟動的,你也可以使用服務名來進入容器:
docker-compose exec <服務名> /bin/bash
docker-compose exec laravel.test /bin/bash
compose 及exec 差別:
docker ps
會顯示所有正在運行的容器。docker-compose ps
僅顯示由特定 docker-compose.yml
文件定義的服務的容器狀態。docker exec
命令允許您在一個已經運行的容器中運行命令。這裡我都還只提到創建容器的部分,後續如果有機會應該會分享一些實際上使用docker容器跑我的專案。